using Microsoft.EntityFrameworkCore;
using OrchardCore.Environment.Shell;
using OrchardCore.Data;

namespace OrchardCore.Data.EFCore;

/// <summary>
/// EF Core数据库连接验证器接口
/// 用于验证EF Core数据库连接的有效性和状态，确保DbContext配置正确且数据库可访问
/// </summary>
/// <remarks>
/// 主要功能：
/// - 验证EF Core连接字符串的格式和有效性
/// - 检测EF Core数据库提供程序是否受支持
/// - 验证数据库表结构和初始化状态
/// - 检查EF Core迁移状态
/// - 验证DbContext配置的正确性
/// </remarks>
public interface IEFCoreConnectionValidator
{
    /// <summary>
    /// 异步验证EF Core数据库连接
    /// </summary>
    /// <param name="context">EF Core数据库连接验证上下文，包含连接信息和Shell设置</param>
    /// <returns>
    /// 返回验证结果枚举，表示连接状态：
    /// - EFDocumentTableFound: 连接有效且Document表存在
    /// - EFDocumentTableNotFound: 连接有效但Document表不存在
    /// - EFInvalidConnection: 连接失败
    /// - EFNoProvider: 数据库提供程序缺失
    /// - EFUnsupportedProvider: 不支持的数据库提供程序
    /// - EFInvalidCertificate: SSL证书无效
    /// - EFMigrationRequired: 需要执行EF Core迁移
    /// - EFDbContextError: DbContext配置错误
    /// </returns>
    Task<EFCoreConnectionValidatorResult> ValidateAsync(EFCoreConnectionValidatorContext context);
}

/// <summary>
/// EF Core连接验证结果枚举
/// </summary>
public enum EFCoreConnectionValidatorResult
{
    /// <summary>
    /// 连接有效且Document表存在
    /// </summary>
    EFDocumentTableFound,

    /// <summary>
    /// 连接有效但Document表不存在
    /// </summary>
    EFDocumentTableNotFound,

    /// <summary>
    /// 连接失败
    /// </summary>
    EFInvalidConnection,

    /// <summary>
    /// 数据库提供程序缺失
    /// </summary>
    EFNoProvider,

    /// <summary>
    /// 不支持的数据库提供程序
    /// </summary>
    EFUnsupportedProvider,

    /// <summary>
    /// SSL证书无效
    /// </summary>
    EFInvalidCertificate,

    /// <summary>
    /// 需要执行EF Core迁移
    /// </summary>
    EFMigrationRequired,

    /// <summary>
    /// DbContext配置错误
    /// </summary>
    EFDbContextError
}

/// <summary>
/// EF Core连接验证上下文
/// </summary>
public class EFCoreConnectionValidatorContext
{
    /// <summary>
    /// 数据库提供程序类型
    /// </summary>
    public string DatabaseProvider { get; set; }

    /// <summary>
    /// 连接字符串
    /// </summary>
    public string ConnectionString { get; set; }

    /// <summary>
    /// Shell设置
    /// </summary>
    public ShellSettings ShellSettings { get; set; }

    /// <summary>
    /// DbContext类型
    /// </summary>
    public Type DbContextType { get; set; }
} 